package com.awesome.uidemo.eventdispatch;

import android.os.Bundle;
import android.view.MotionEvent;
import androidx.appcompat.app.AppCompatActivity;

import com.awesome.common.util.log.ShowLogUtil;
import com.awesome.uidemo.R;

/**
 * 事件分发机制
 * 重要方法：dispatchTouchEvent和onTouchEvent
 * 重要元素：Activity、ViewGroup、View
 ---对于DOWN事件---
 1.返回true都为消费。
 2.dispatch返回super调用子类的dispatch。
 3.dispatch返回false调用父类的onTouchEvent()。最大父类为消费。
 3.onTouchEvent返回super、false调用父类的onTouchEvent。
 4.onIntercept返回true调用当前view的onTouchEvent。
 5.onIntercept返回super、false调用子类的dispatch。
 ---对于MOVE、UP事件---
 1.哪里返回true消费了，会收到MOVE、UP事件。
 2.没有消费，Activity的dispatch会收到MOVE、UP事件。
 如果是dispatchTouchEvent( )消费了，与DOWN的走势相同。如果是onTouchEvent( )消费了，会先调用dispatchTouchEvent( )到这个控件，之后调用这个控件的onTouchEvent( )进行消费。
 ---对于CANCEL事件---
 当调用ACTION_MOVE或ACTION_UP时，父类的onInterceptTouchEvent返回true，本应该调用ACTION_MOVE或ACTION_UP的View
调用ACTION_CANCEL，并且以后不再接收ACTION_MOVE或ACTION_UP事件。
 */
public class EventDispatchActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_dispatch);
//        findViewById(R.id.my_tv).setOnTouchListener(new View.OnTouchListener() {
//            @Override
//            public boolean onTouch(View v, MotionEvent event) {
//                switch (event.getAction()){
//                    case MotionEvent.ACTION_DOWN:
//                        ShowLogUtil.info("MyTextView ACTION_DOWN");
//                        break;
//                    case MotionEvent.ACTION_MOVE:
//                        ShowLogUtil.info("MyTextView ACTION_MOVE");
//                        break;
//                    case MotionEvent.ACTION_UP:
//                        ShowLogUtil.info("MyTextView ACTION_UP");
//                        break;
//                    case MotionEvent.ACTION_CANCEL:
//                        ShowLogUtil.info("MyTextView ACTION_CANCEL");
//                        break;
//                }
//                return false;
//            }
//        });
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction()){
            case MotionEvent.ACTION_DOWN:
                ShowLogUtil.info("Activity dispatchTouchEvent ACTION_DOWN");
//                // 消费
//                return false;
//                // 消费
//                return true;
                break;
            case MotionEvent.ACTION_MOVE:
                ShowLogUtil.info("Activity dispatchTouchEvent ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                ShowLogUtil.info("Activity dispatchTouchEvent ACTION_UP");
                break;
        }
        //子View的dispatchTouchEvent
        boolean dispatchTouchEvent = super.dispatchTouchEvent(ev);
        switch (ev.getAction()){
            case MotionEvent.ACTION_DOWN:
                ShowLogUtil.info("---return Activity dispatchTouchEvent ACTION_DOWN "+dispatchTouchEvent);
                break;
            case MotionEvent.ACTION_MOVE:
                ShowLogUtil.info("---return Activity dispatchTouchEvent ACTION_MOVE "+dispatchTouchEvent);
                break;
            case MotionEvent.ACTION_UP:
                ShowLogUtil.info("---return Activity dispatchTouchEvent ACTION_UP "+dispatchTouchEvent);
                break;
        }
        return dispatchTouchEvent;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
//                // 父View的onTouchEvent
//                return false;
//                // 消费
//                return true;
                ShowLogUtil.info("Activity onTouchEvent ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                ShowLogUtil.info("Activity onTouchEvent ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                ShowLogUtil.info("Activity onTouchEvent ACTION_UP");
                break;
            case MotionEvent.ACTION_CANCEL:
                ShowLogUtil.info("Activity onTouchEvent ACTION_CANCEL");
                break;
        }
        // 父View的onTouchEvent
        boolean onTouchEvent = super.onTouchEvent(event);
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                ShowLogUtil.info("---return Activity onTouchEvent ACTION_DOWN "+onTouchEvent);
                break;
            case MotionEvent.ACTION_MOVE:
                ShowLogUtil.info("---return Activity onTouchEvent ACTION_MOVE "+onTouchEvent);
                break;
            case MotionEvent.ACTION_UP:
                ShowLogUtil.info("---return Activity onTouchEvent ACTION_UP "+onTouchEvent);
                break;
            case MotionEvent.ACTION_CANCEL:
                ShowLogUtil.info("---return Activity onTouchEvent ACTION_CANCEL "+onTouchEvent);
                break;
        }
        return onTouchEvent;
    }
}